import java.util.ArrayList;
import java.util.Scanner;

/*
1.小数点前面是整数部分，有两种情况：
    1、如果后面没有小数点就是十进制整数，以1~9开头、后跟0~9的任意多个数字；
    2、单个的0；
2.小数部分，从小数点开始，是可选的，小数点后跟1到多个0~9的任意数字；
3.指数部分，从e开始，也是可选的，e后面跟上可选的+/-，后跟1到多个0~9的任意数字。
请根据以上描述设计识别无符号浮点数的有穷自动机，根据识别结果输出“Yes”或“no”，并可以给出出错的位置。。

//  正则 (0|[1-9][0-9]*)((e[+-]?|\.)[0-9]+)?

* */
public class App {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        while (true){
            System.out.println("please enter an unsigned floating point number:");
            input(sc.nextLine());
        }
        // test();
    }


    /**
     * 输入
     * @param str
     */
    static void input(String str){
        State state = State.S0;
        int i;
        for (i = 0; i < str.length(); i++) {
            CharType charType = getCharType(str.charAt(i));
            if(charType == CharType.Error){
                System.out.format("Error,unable to parse '%c' in '%s'",str.charAt(i),str);
                return;
            }
            state = transform(state, charType);
            if(state == State.Error){
                System.out.format("Error,unable to parse '%c' in '%s'",str.charAt(i),str);
                return;
            }
        }
        if(state == State.S1 || state == State.S2 || state == State.S5){
            System.out.println("Yes");
        }else{
            System.out.format("Error,unable to parse '%c' in '%s'\n",str.charAt(i-1),str);
        }

    }

    /**
     * 状态转换
     * @param state 当前状态
     * @param charType 下一个字符的类型
     * @return 一个新的状态
     */
    static State transform(State state, CharType charType) {
        switch (state) {
            case S0:
                switch (charType) {
                    case NumberRemoveZero:
                        return State.S1;
                    case Zero:
                        return State.S2;
                }
                return State.Error;
            case S1:
                switch (charType) {
                    case Zero:
                    case NumberRemoveZero:
                        return State.S1;
                    case E:
                        return State.S3;
                    case Point:
                        return State.S4;
                }
                return State.Error;
            case S2:
                switch (charType) {
                    case E:
                        return State.S3;
                    case Point:
                        return State.S4;
                }
                return State.Error;
            case S3:
                switch (charType) {
                    case Operator:
                        return State.S4;
                    case Zero:
                    case NumberRemoveZero:
                        return State.S5;
                }
                return State.Error;
            case S4:
                switch (charType) {
                    case Zero:
                    case NumberRemoveZero:
                        return State.S5;
                }
            case S5:
                switch (charType) {
                    case Zero:
                    case NumberRemoveZero:
                        return State.S5;
                }
                return State.Error;
        }
        return State.Error;
    }

    /**
     * 获取字符的类型
     * @param ch 输入的字符
     * @return 字符的类型
     */
    static CharType getCharType(char ch) {
        switch (ch) {
            case '0':
                return CharType.Zero;
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return CharType.NumberRemoveZero;
            case '.':
                return CharType.Point;
            case '+':
            case '-':
                return CharType.Operator;
            case 'e':
                return CharType.E;
            default:
                return CharType.Error;
        }
    }


    static void test(){
        ArrayList<String> strList = new ArrayList<>();
        strList.add("0.30");
        strList.add("3.");
        strList.add(".5");
        strList.add("100e9");
        strList.add("100e-5");
        strList.add("100.43e56");
        for (String str : strList) {
            System.out.println("> " + str);
            input(str);
        }
    }

}
